#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
#include "mtlib.c"
#include <semaphore.h>

void obtenerSectoresClean(char *, char  * ,char * );
int obtenerSectoresTrace(char *, long *);
unsigned char centro;
#include "ProcesarEImprimir.c"


int main(int argc, char **argv)
    {

        int ret;
        pthread_t hiloProcesarColaConsola;


    char  valorInicial[20] = {' '},valorFinal[20] = {' '};
    int secIni, secFin, cantidad = 0;
    long sectores[5];

    int pararEjecucion = 0;
    int parar = 0;
    char cadena[30] ={' '};
    char cadenaAux[30] ={' '};
    int i = 0, c = 0;
    unsigned int conexion_con_PPD;
    
	
    centro = mtf_obtener_descriptor(1024);
    conexion_con_PPD = mtf_conectar(centro, MTP_UNIX_ESCUCHA, "archivoConexion" );

        while (parar == 0) {
                                                
            if (mtf_recibir_mensajes(centro ) == 0) continue;

                        mti_mensaje datosMensaje = mtf_siguiente_mensaje(centro );
	
                        if (datosMensaje.categoria != MTA_ACEPTAR) {
                        continue;
                        
                        } else {
			mtf_desconectar(centro,conexion_con_PPD);
			conexion_con_PPD = datosMensaje.remitente; 	
                        parar = 1;
                                  }              
                }


        ret  = pthread_create(&hiloProcesarColaConsola,NULL,(void *)imprimirInfoYTrace,NULL);

    while (!pararEjecucion)
    {

//obtengo el comando (trace, info, clean)
    while ((c = getchar()) != '\n')
        {
        cadena[i] = c;
        i++;
        }
        i = 0;
        while (cadena[i] != ' ' && cadena[i] != '\0')
        {
        cadenaAux[i] = cadena[i];
        i++;
        }
	i++;
	cadenaAux[i] = 0;
   if(strcmp(cadenaAux,"info") == 0){

      mtf_enviar_mensaje(centro,conexion_con_PPD ,MTE_INFO_DISCO);


       }

   if(strcmp(cadenaAux,"clean") == 0){
      obtenerSectoresClean(cadena, valorInicial, valorFinal);

       secIni = atoi(valorInicial);
       secFin = atoi(valorFinal);

       mtf_enviar_mensaje(centro, conexion_con_PPD , MTQ_LIMPIAR_DISCO,(long)secIni,(long)secFin);
    }

    if(strcmp(cadenaAux,"trace")){
        cantidad = obtenerSectoresTrace(cadena, sectores);
        mtf_enviar_mensaje(centro, conexion_con_PPD , MTE_TRACE_DISCO, cantidad, sectores[0], sectores[1], sectores[2], sectores[3], sectores[4]);


    }
   

    }
	return 0;	
	}


int obtenerSectoresTrace(char * cadena, long * sectores){

    int posCad    = 0;
    int posVecCad = 0;
    int posVecInt = 0;
    int cantidad  = 0;
    char aux[30];
    int i = 0;

        while (cadena[posCad] != ' '){
                posCad++;
            }

        posCad++;

        while(cadena[posCad] != '\0'){

                while(cadena[posCad] != ' '){
                        aux[i] = cadena[posCad];
                        posCad ++;
                        i++;
                }

                posCad ++;
                cantidad ++;
                aux[i++] = 0;
                int j = 0;
                sectores[posVecCad] = atoi(aux);
                i = 0;
                for(j = 0; j<20; j++) aux[j] = 0;
                posVecCad ++;
                }
                return cantidad;
        }

    void obtenerSectoresClean(char * cadena, char  * valorInicial,char * valorFinal){
    int i = 0;
    int j = 0;
    while (cadena[i] != ' '){
    i++;
    }

    i++;

    while (cadena[i] != ' '){
    valorInicial[j] = cadena[i];
    i++;
    j++;
    }

    j = 0;
    i++;

    while (cadena[i] != '\0'){
    valorFinal[j] = cadena[i];
    i++;
    j++;
    }

 }

